package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC Java DataBase Connectivity Java实现数据库连接
 *      -- 比如Java程序员想写一个 Java 代码操作数据库 显然这个代码不能同时操作不同的数据库
 *          那学习的时候什么规范都要学 太麻烦 所以希望有一套统一的规范去用 Java 操作所有关系型数据库
 *          于是JDBC 是一个接口 定义了一套接口 即操作数据库的一套规范 他没有定义实现类   实现类是数据库厂商自己写的
 *          不同的实现类去实现不同的数据库操作 (数据库驱动)
 *
 * JDBC 快速入门
 *      -- 首先去官网下载mysql-connector-java-8.0.15.zip 然后解压出mysql-connector-java-8.0.15.jar
 *      -- 在工程与 src 平级的目录下添加一个 lib 文件夹 添加为库文件 然后把jar包添加进去 于是这个 jar 包就可以被直接调用了
 *      -- 或者在项目结构里导入库
 *
 *      --1.导入 jar 包
 *      --2.注册驱动    告诉程序用哪个驱动 jar 包
 *      --3.获取数据库连接对象 Connection
 *      --4.定义sql
 *      --5.获取sql执行对象 Statement 获取结果
 *      --6.处理结果 关闭资源
 *
 * DriveManager：驱动管理对象
 *      注册驱动
 *          static void registerDriver(Driver driver)   这是注册驱动的类
 *          写代码的时候用 Class.forName("com.mysql.cj.jdbc.Driver")
 *          为什么不一样 ？？？ 而且 Driver 类也没用过 ？？？ --> Driver 注册的时候有代码会被自动执行 --> 静态代码块
 *              static {
 *                  try {
 *                      DriverManager.registerDriver(new Driver());
 *                  } catch (SQLException var1) {
 *                      throw new RuntimeException("Can't register driver!");
 *                      }
 *                  }
 *          可见真正注册驱动的是上面的那个方法 下面那个在加载的时候也会执行上面那个方法
 *      获取数据库连接     返回一个数据库连接对象
 *          driverManager.getConnection(url , user , password)
 *              url:数据库的路径 jdbc:mysql://主机地址:端口号/数据库名
 * Connection：数据库连接对象
 *          获取数据库的连接对象
 *              connection.getStatement()
 *              connection.prepareStatement(sql)
 *          管理事务：
 *              开启事务 setAutoCommit(false)
 *              提交事务 commit()
 *              回滚事务 rollback()
 * Statement：执行sql的对象
 *          execute(String sql )
 *          executeUpdate(String sql)   执行增删改     返回值是影响的行数
 *          executeQuery(String sql)    执行查询
 * ResultSet：结果集
 *          封装查询的结果
 *              初始的时候游标指向第一行
 *                  next() 将游标向下移动一行 并且判断是不是最后一行
 *                  getXXX() 获取数据
 *                  getInt() 获取 int 数据  参数： int 类型的列索引 String 类型列名
 * PreparedStatement：执行sql的对象(预编译 sql )
 */
public class JdbcDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //注册驱动  就是把驱动类加载进内存
        Class.forName("com.mysql.cj.jdbc.Driver") ;
        //获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/tlias" , "root" , "204020") ;
        //定义 sql
        String sql = "update emp set password = 654321 where id = 1" ;
        //获取执行sql的对象
        Statement statement = connection.createStatement();
        //执行sql 返回对象是影响的行数
        int count = statement.executeUpdate(sql) ;
        //处理结果
        if(count > 0){
            System.out.println("修改成功");
        }else{
            System.out.println("修改失败");
        }

        //释放资源
        connection.close();
        statement.close();
    }
}
